package com.zzg.datastructure.search;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author zhengzg
 * @Date 2022-09-15
 * @Version v1.0
 *
 * 插值查找算法：要求数组是有序的
 */
public class InsertValueSearch {

    public static void main(String[] args) {
        int[] arr = {1, 8, 10, 89, 123, 1000, 1000};
        List<Integer> index = insertValueSearch(arr,0,arr.length - 1,1000);
        System.out.println(index);
    }

    private static List<Integer> insertValueSearch(int[] arr, int left, int right, int findVal) {
        // 未找到情况，和越界情况
        if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
            return new ArrayList<Integer>();
        }
        /*
         * 理解
         * 想找的值偏向最大值，findVal - arr[left]则偏向最大值，同时arr[right] - arr[left]为固定值
         * 将上俩减法图形化，就是两条长度接近的线段，分子越大越接近1，则公式越接近left + (right - left)
         * 即寻找值越大，索引位置越接近right。
         * 值偏向最小值同理
         */
        int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
        if (findVal > arr[mid]) {
            //向右找
            return insertValueSearch(arr,mid + 1,right,findVal);
        } else if (findVal < arr[mid]) {
            return insertValueSearch(arr,left,mid - 1,findVal);
        } else {

            // 存贮索引的集合
            List<Integer> indexList = new ArrayList<>();

            // 向左寻找
            int temp = mid - 1;
            while (temp >= 0 && arr[temp] == findVal) {
                indexList.add(temp);
                temp--;
            }

            indexList.add(mid);

            // 向右寻找
            temp = mid + 1;
            while (temp <= arr.length - 1 && arr[temp] == findVal) {
                indexList.add(temp);
                temp++;
            }

            return indexList;
        }
    }


}
